// ignore: file_names
import 'package:dio/dio.dart';
import 'package:enjoy_life/utils/CheckAuth.dart';
import 'package:enjoy_life/utils/EventsBus.dart';
import 'package:event_bus/event_bus.dart';

class NetworkService {
  final Dio _dio = Dio();

  NetworkService() {
    // 设置基地址
    _dio.options.baseUrl = 'https://live-api.itheima.net/';
    // 设置超时时间
    _dio.options.connectTimeout = Duration(seconds: 20);
    // 设置响应超时时间
    _dio.options.receiveTimeout = Duration(seconds: 20);
    // 配置请求头
    _dio.options.headers = {'Content-Type': 'application/json'};
    // 配置拦截器
    _interceptors();
  }

  // 拦截器
  void _interceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
          // 请求发送之前执行的操作。
          // 如果你想用自定义数据解析请求，

          final token = CheckAuth().getToken() ?? '';
          // 如果有 token，添加到请求头中
          if (token.isNotEmpty) {
            options.headers['Authorization'] = 'Bearer $token';
          }

          // 可以使用 `handler.resolve(response)` 解析一个 `Response`。
          // 如果你想用错误信息拒绝请求，
          // 可以使用 `handler.reject(dioError)` 拒绝一个 `DioException`。
          return handler.next(options);
        },
        // 统一处理 成功响应
        onResponse: (Response response, ResponseInterceptorHandler handler) {
          // 对响应数据进行操作。
          // 如果你想用错误信息拒绝请求，
          // 可以使用 `handler.reject(dioError)` 拒绝一个 `DioException` 对象。
          return handler.next(response);
        },
        // 统一处理 失败响应
        onError: (DioException error, ErrorInterceptorHandler handler) {
          // 对响应错误进行操作。
          // 如果你想用一些自定义数据解析请求，
          // 可以使用 `handler.resolve(response)` 解析一个 `Response` 对象。
          return handler.next(error);
        },
      ),
    );
  }

// get  请求
  Future<dynamic> get(String url, {Map<String, dynamic>? params}) async {
    try {
      final res = await _dio.get(url, queryParameters: params);
      return handleResponse(res);
    } catch (e) {
      return handleError(e);
    }
  }

// post  请求
  Future<dynamic> post(String url, {dynamic data}) async {
    try {
      final res = await _dio.post(url, data: data);
      return handleResponse(res);
    } catch (e) {
      return handleError(e);
    }
  }

// put  请求
  Future<dynamic> put(String url, {Map<String, dynamic>? data}) async {
    try {
      final res = await _dio.put(url, data: data);
      return handleResponse(res);
    } catch (e) {
      return handleError(e);
    }
  }

// put  请求
  Future<dynamic> delete(String url, {Map<String, dynamic>? data}) async {
    try {
      final res = await _dio.delete(url, data: data);
      return handleResponse(res);
    } catch (e) {
      return handleError(e);
    }
  }

// 成功结果的处理
  dynamic handleResponse(Response response) {
    if (response.statusCode! >= 200 && response.statusCode! < 300) {
      return response.data;
    } else {
      throw Exception('请求失败，状态码：${response.statusCode}');
    }
  }

// 失败结果的处理
  dynamic handleError(error) async {
    if (error is DioException) {
      if (error.type == DioExceptionType.connectionTimeout ||
          // 网络连接超时
          error.type == DioExceptionType.receiveTimeout) {
        throw Exception('网络连接超时');
      } else if (error.type == DioExceptionType.badResponse) {
        if (error.response?.statusCode == 401) {
          // 清空token
          await CheckAuth().removeToken();
          // 通知跳转至登录页
          eventBus.fire(AuthEvent());
        } else {
          // 响应超时
          throw Exception('响应错误，状态码：${error.response?.statusCode}');
        }
      } else {
        throw Exception('网络请求错误：$error');
      }
    } else {
      throw Exception('未知错误：$error');
    }
  }
}

// 导出实例
final http = NetworkService();
